package com.c2b.algorithm.leetcode.base;

import java.util.HashMap;
import java.util.Map;

/**
 * <a href='https://leetcode.cn/problems/decode-the-message/'>解密消息(Decode the Message)</a>
 * <p>
 * 给你字符串 key 和 message ，分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下：
 *     <ol>
 *         <li>使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。</li>
 *         <li>将替换表与普通英文字母表对齐，形成对照表。</li>
 *         <li>按照对照表 替换 message 中的每个字母。</li>
 *         <li>空格 ' ' 保持不变。</li>
 *     </ol>
 * </p>
 * <p>例如，key = "happy boy"（实际的加密密钥会包含字母表中每个字母 至少一次），据此，可以得到部分对照表（'h' -> 'a'、'a' -> 'b'、'p' -> 'c'、'y' -> 'd'、'b' -> 'e'、'o' -> 'f'）。</p>
 * <p>返回解密后的消息。</p>
 *
 * <p>
 * <b>示例</b>
 * <pre>
 *     <a href='https://leetcode.cn/problems/decode-the-message/'>跳转查看示例</a>
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *  <ul>
 *      <li>26 <= key.length <= 2000</li>
 *      <li>key 由小写英文字母及 ' ' 组成</li>
 *      <li>key 包含英文字母表中每个字符（'a' 到 'z'）至少一次</li>
 *      <li>1 <= message.length <= 2000</li>
 *      <li>message 由小写英文字母和 ' ' 组成</li>
 *  </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/22 9:45
 */
public class LC2325DecodeTheMessage_S {
    static class Solution {

        public String decodeMessage(String key, String message) {
            char[] ref = new char[26];
            char valueCh = 'a';
            for (char keyCh : key.toCharArray()) {
                if (keyCh != ' ' && ref[keyCh - 'a'] == 0) {
                    ref[keyCh - 'a'] = valueCh++;
                }
            }
            char[] messageChars = message.toCharArray();
            for (int i = 0; i < messageChars.length; i++) {
                if (messageChars[i] != ' ') {
                    messageChars[i] = ref[messageChars[i] - 'a'];
                }
            }
            return new String(messageChars);
        }


        public String decodeMessage2(String key, String message) {
            Map<Character, Character> map = new HashMap<>();
            char valueCh = 'a';
            for (char keyCh : key.toCharArray()) {
                if (keyCh != ' ' && !map.containsKey(keyCh)) {
                    map.put(keyCh, valueCh);
                    valueCh += 1;
                }
            }
            StringBuilder stringBuilder = new StringBuilder();
            for (char c : message.toCharArray()) {
                if (c == ' ') {
                    stringBuilder.append(" ");
                } else {
                    stringBuilder.append(map.get(c));
                }
            }
            return stringBuilder.toString();
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.decodeMessage("the quick brown fox jumps over the lazy dog", "vkbs bs t suepuv"));
        System.out.println(solution.decodeMessage("eljuxhpwnyrdgtqkviszcfmabo", "zwx hnfx lqantp mnoeius ycgk vcnjrdb"));
    }
}
